/**
  ******************************************************************************
  * @file    dht11.h
  * @author  ashuai0110
  * @version V2.3
  * @date    2024-07-01
  * @brief   DHT11温湿度模块驱动
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __DHT11_H
#define __DHT11_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup devices
 * @{
 */

/**
 * @addtogroup dht11
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/
/**
 * @defgroup dht11_global_macros dht11 global macros
 * @{
 */

/**
 * @defgroup dht11_io_rw_mode dht11 io read write mode
 * @{
 */
#define DHT11_MODE_READ                     (0u) /*!< 读IO */
#define DHT11_MODE_WRITE                    (1u) /*!< 写IO */
/**
 * @}
 */

/**
 * @defgroup dht11_io_mode dht11 io mode
 * @{
 */
#define DHT11_MODE_INPUT                     (0u) /*!< IO输入 */
#define DHT11_MODE_OUTPUT                    (1u) /*!< IO输出 */
/**
 * @}
 */

/**
 * @}
 */

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup dht11_global_types dht11 global types
 * @{
 */

/**
  * @brief  IO模式设置函数
  *
  * @note   根据IO模式去切换IO口的输入输出模式
  *
  * @param  mode              : IO模式
  *   @arg  DHT11_MODE_INPUT  : IO输入
  *   @arg  DHT11_MODE_OUTPUT : IO输出
  *
  * @retval None
  */
typedef void (* dht11_io_mode_set_fn_t)(uint8_t mode);

/**
  * @brief  IO读写函数
  *
  * @note   根据读写模式去执行写IO还是读IO,写IO时返回值无效,读IO时level参数无效
  *
  * @param  rwMode           : 读写模式
  *   @arg  DHT11_MODE_READ  : 读IO
  *   @arg  DHT11_MODE_WRITE : 写IO
  *
  * @param  level            : 电平
  *   @arg  0                : 低电平
  *   @arg  !0               : 高电平
  *
  * @retval 返回IO的输入电平
  */
typedef uint8_t (* dht11_io_rw_fn_t)(uint8_t rwMode, uint8_t level);

/**
  * @brief  dht11 structure definition
  */
typedef struct dht11 {
    uint8_t humiInte; /*!< 湿度整数部分 */
    uint8_t humiDeci; /*!< 湿度小数部分 */
    uint8_t tempInte; /*!< 温度整数部分 */
    uint8_t tempDeci; /*!< 温度小数部分 */
    
    dht11_io_mode_set_fn_t ioModeSetFn; /*!< IO模式设置函数 */
    dht11_io_rw_fn_t ioReadWriteFn;     /*!< IO读写函数 */
} dht11_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup dht11_global_functions
 * @{
 */

void dht11_register_delay_us(void (* delayUsFn)(uint32_t us));

void dht11_init(dht11_t *_dht11, dht11_io_mode_set_fn_t ioModeSetFn, dht11_io_rw_fn_t ioRWFn);

uint8_t dht11_read_data(dht11_t *_dht11);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* dht11.h */
